/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.engine;

import fait.ferm.global.Glob;
import fait.ferm.persists.Cow;
import fait.ferm.persists.Cow_group;
import fait.ferm.persists.Credit;
import fait.ferm.persists.Credit_type;
import fait.ferm.persists.Discontent;
import fait.ferm.persists.Equipment;
import fait.ferm.persists.Equipment_breakdown;
import fait.ferm.persists.Ferm;
import fait.ferm.persists.Fine;
import fait.ferm.persists.Fodder;
import fait.ferm.persists.Game;
import fait.ferm.persists.Milk_store;
import fait.ferm.persists.Plan_details_care;
import fait.ferm.persists.Plan_details_care_ex;
import fait.ferm.persists.Resource_counter;
import fait.ferm.persists.SimpleDirItem;
import fait.ferm.persists.Staff_table;
import fait.ferm.persists.Staff_type;
import fait.ferm.persists.Supplies_store;
import fait.ferm.persists.Users;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Класс движка фермы. Выполняет все действия работы с фермой. 
 * Реализует логику работы программы. Взаимодействие с базой данных идет только через него.
 * @author zx
 */
public class FermEngine implements IfaceEngine
{
	private Connection con;
	
	/**
	 * Конструктор без параметров. Инициализирует соединение с БД
	 */
	public FermEngine(){
		con = Glob.getConnection();
	}

	//login 
	/**
	 * Выполняет регистрацию пользователя в системе. 
	 * Просматривает таблицу users на совпадение имени пользователя и пароля. 
	 * Возвращает объект типа Users или null
	 * @param userName имя пользователя
	 * @param password пароль
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, объект Users (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
	@Override
	public ResultEngine login(String userName, String password) {
		Users u = Users.getUserByName(userName, password);
		ResultEngine res;
		if(u !=null){
			res = new ResultEngine( u, GlobalEngine.E_NO_ERROR);
		}
		else {
			res = new ResultEngine( null, GlobalEngine.E_NOT_LOGIN);
		}
		
		return res;
	}
	
	/**
	 * Метод создает нового пользователя. Записывает его в таб users.
	 * @param userName имя пользователя
	 * @param password пароль
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, объект Users (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
	@Override
	public ResultEngine newUser(String userName, String password) {
		ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			st = con.createStatement();
			String q = "SELECT id FROM users WHERE name = '" + userName + "'";
			rs = st.executeQuery(q);
			if(rs.next()){
				res = new ResultEngine(null, GlobalEngine.E_USER_ALREADY_EXISTS);
				return res;
			}
		}
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		try {
			//создаем пользователя
			Users u = new Users();
			u.name = userName;
			u.password = password;
			u.save();
			Glob.setUser(u);
			startGame();
			
			return new ResultEngine(u, GlobalEngine.E_NO_ERROR);
		} catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		} catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		res = new ResultEngine(null, GlobalEngine.E_NOT_LOGIN);
		return res;
	}
	
	private void startGame() throws SQLException, Exception{
		Users u = Glob.getUser();
		//создаем объект "игра"
		Game g = new Game();
		g.user_id = u.getId();
		g.save();
		//создаем объект "ферма"
		Ferm f = new Ferm();
		f.game_id = g.getId();
		f.name = "Ферма "+u.name;
		f.save();
		//создаем запас своих кормов
		Fodder fod = new Fodder();
		fod.year = g.current_date.getYear()+1900;
		fod.save();
		//выделить место на складе материалов
		Collection<SimpleDirItem> supDir = Glob.getDirInCache("suppliers").getItems();
		Supplies_store ss;
		for(SimpleDirItem x:supDir ){
			ss = new Supplies_store();
			ss.supplies_id = x;
			ss.save();
		}
		//выделить место на складе молока
		supDir = Glob.getDirInCache("sort").getItems();
		Milk_store ms;
		for(SimpleDirItem x:supDir ){
			ms = new Milk_store();
			ms.sort_id = x;
			ms.save();
		}
		//выделить место для счетчиков ресурсов
		supDir = Glob.getDirInCache("resource_counter").getItems();
		Resource_counter rc;
		for(SimpleDirItem x:supDir ){
			rc = new Resource_counter();
			rc.resource_type_id = x;
			rc.save();
		}
		//вставить строки для недовольства организаций
		supDir = Glob.getDirInCache("pay_org").getItems();
		Discontent ds;
		for(SimpleDirItem x:supDir ){
			ds = new Discontent();
			ds.pay_org_id = x;
			ds.save();
		}
		//создать текущий план

	}
	
	/**
	 * Возвращает ферму текущего пользователя
	 * @param u - текущий пользователь
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, объект {@link Ferm Ferm} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
	public ResultEngine getFerm(Users u){
		ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
		Game g = Glob.getGame();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM ferm WHERE game_id=" + g.getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				Ferm f = new Ferm(rs.getInt("id"));
				res = new ResultEngine(f, GlobalEngine.E_NO_ERROR);
				return res;
			}
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
	}
    
    /**
	 * Возвращает массив животных в группе
     * @param pId - id группы в бд
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Cow Cow} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getCowFromGroup(int pId) {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Cow> ar = new ArrayList<> ();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM cow WHERE ferm_id=" + Glob.getFerm().getId() + " AND cow_group_id=" + pId;
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Cow(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    
    /**
	 * Возвращает массив групп животных существующих на ферме
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Cow_group Cow_group} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getCowGroup() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Cow_group> ar = new ArrayList<> ();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM cow_group WHERE ferm_id=" + Glob.getFerm().getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Cow_group(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    
    /**
	 * Возвращает массив активных кредиов
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Credit Credit} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getCreditActive() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Credit> ar = new ArrayList<> ();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM credit WHERE ferm_id=" + Glob.getFerm().getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Credit(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    
    /**
	 * Возвращает массив доступных кредиов
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Credit_type Credit_type} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getCreditType() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Credit_type> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM credit_type";
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Credit_type(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    /**
	 * Возвращает массив штрафов по определённому кредиту
     * @param credit - объект типа {@link Credit Credit} содержащий информацию по кредиту для которого ищем штрафы
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Fine Fine} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getFineFrom(Credit credit) {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Fine> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM fine WHERE credit_id=" + credit.getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Fine(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
	
	
	/**
	 * Метод возвращает дерево категорий в главном окне. Дерево представлено в виде массива объектов
	 * @param fa - фермa зарегисрированного пользователя
	 * @return ResultEngine, содержащий в поле <code>obj</code> дерево в виде массива объектов типа
	 * {@link fait.ferm.engine.TreeItem TreeItem}
	 */
	@Override
	public ResultEngine getMainCategoryTree(Ferm fa){
		//ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
		ArrayList<TreeArrItem> ar = new ArrayList<>();
		try {
			st = con.createStatement();
			String q = "SELECT id,name, parent_id FROM zz_category_tree ORDER BY parent_id,id";
			rs = st.executeQuery(q);
			while(rs.next()){
				TreeArrItem ti = new TreeArrItem(rs.getInt("id"), rs.getString("name"), rs.getInt("parent_id"));
				if(ti.id == -1){ ti.name = fa.name;}
				ar.add(ti);
			}
				return new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
		}
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
	}

	@Override
	public ResultEngine getEquipment() {
		ResultEngine res = null;
                Statement st = null;
                ResultSet rs = null;
        ArrayList<Equipment> ar = new ArrayList<> ();
                try {
                        st = con.createStatement();
                        String q = "SELECT id FROM equipment WHERE ferm_id=" + Glob.getFerm().getId();
                        rs = st.executeQuery(q);
                        while(rs.next()){
                                ar.add(new Equipment(rs.getInt("id")));
                        }
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
                } 
                catch (SQLException ex) {
                        Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
                }catch (Exception ex) {
                        Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
                }               
                finally {
                        try {
                                rs.close();
                                st.close();
                        } catch (SQLException ex) {
                                Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
                        }
                }
                return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
	}

    /**
	 * Возвращает массив персонала
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Staff_table Staff_table} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getStaff_table() {
   ResultEngine res = null;
                Statement st = null;
                ResultSet rs = null;
        ArrayList<Staff_table> ar = new ArrayList <>();
                try {
                        st = con.createStatement();
                        String q = "SELECT id FROM staff_table WHERE ferm_id = " + Glob.getFerm().getId();
                        rs = st.executeQuery(q);
                        while(rs.next()){
                                ar.add(new Staff_table(rs.getInt("id")));
                        }
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
                } 
                catch (SQLException ex) {
                        Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
                }catch (Exception ex) {
                        Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
                }               
                finally {
                        try {
                                rs.close();
                                st.close();
                        } catch (SQLException ex) {
                                Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
                        }
                }
                return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
		
	}

	@Override
	public ResultEngine getResourceCounters() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Resource_counter> ar = new ArrayList<> ();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM resource_counter WHERE ferm_id=" + Glob.getFerm().getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				int n = rs.getInt("id");
				ar.add(new Resource_counter(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
	}

	@Override
	public ResultEngine getSuppliesQuantity() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Supplies_store> ar = new ArrayList<> ();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM supplies_store WHERE ferm_id=" + Glob.getFerm().getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				int n = rs.getInt("id");
				ar.add(new Supplies_store(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
		
	}

	@Override
	public ResultEngine getMilkQuantity() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Milk_store> ar = new ArrayList<> ();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM milk_store WHERE ferm_id=" + Glob.getFerm().getId();
			rs = st.executeQuery(q);
			while(rs.next()){
				int n = rs.getInt("id");
				ar.add(new Milk_store(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
	}

    /**
	 * Возвращает массив типов персонала определённой профессии
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Staff_type Staff_type} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    @Override
    public ResultEngine getStaff_typeFromJob(String job) {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Staff_type> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM staff_type WHERE job = \"" + job + "\"";
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Staff_type(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    
    @Override
    public ResultEngine getEquipment_breakdown() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Equipment_breakdown> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM equipment_breakdown";
			rs = st.executeQuery(q);
			while(rs.next()){
				ar.add(new Equipment_breakdown(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }

    @Override
    public ResultEngine getCurrentPlan() {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<fait.ferm.persists.Plan> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id, date_beg, date_end FROM plan WHERE ferm_id = " + Glob.getFerm().getId();
			rs = st.executeQuery(q);
			while(rs.next()){
                if(Date.valueOf(rs.getString("date_beg")).getTime() <= Glob.getGame().current_date.getTime()) {
                    if(Date.valueOf(rs.getString("date_end")).getTime() >= Glob.getGame().current_date.getTime()) {
                        ar.add(new fait.ferm.persists.Plan(rs.getInt("id")));
                    }
                }
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    
    @Override
    public ResultEngine getPlanDetailsCareFromPlan(fait.ferm.persists.Plan Plan) {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Plan_details_care> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id FROM plan_details_care WHERE plan_id = " + Plan.getId();
			rs = st.executeQuery(q);
			while(rs.next()){
                ar.add(new Plan_details_care(rs.getInt("id")));
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
	
    @Override
    public ResultEngine getPlanDetailsCareExFromPlan(fait.ferm.persists.Plan Plan) {
        ResultEngine res = null;
		Statement st = null;
		ResultSet rs = null;
        ArrayList<Plan_details_care_ex> ar = new ArrayList <>();
		try {
			st = con.createStatement();
			String q = "SELECT id, date_performed FROM plan_details_care_ex WHERE plan_id = " + Plan.getId();
			rs = st.executeQuery(q);
			while(rs.next()){
                if(Date.valueOf(rs.getString("date_performed")).getTime() >= Glob.getGame().current_date.getTime()) {
                    ar.add(new Plan_details_care_ex(rs.getInt("id")));
                }
			}
            res = new ResultEngine(ar, GlobalEngine.E_NO_ERROR);
            return res;
		} 
		catch (SQLException ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}catch (Exception ex) {
			Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(FermEngine.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return new ResultEngine(null, GlobalEngine.E_OBJECT_NOT_FOUND);
    }
    
    
}
